HotFrameLearning Redis_01_简介

-

一、大致介绍

1、介绍Redis之前,我有一堆的疑问,Redis是什么?有什么用?它能干什么?有什么特性?能解决我们日常的哪些问题?
   为什么要用Redis?Redis好在哪里?除了Redis外还有其他替代方案么?
2、对于还没了解过Redis的童鞋,可以带着这些疑问往下看,而对于了解过Redis的童鞋那就走过路过不要错过^_^。
3、另外目前讨论的版本也是比较新的版本3.x版本;

二、简单认识Redis

2.1 何为Redis?

   Redis 是一个开源的基于内存的数据结构化存储媒介,多用于数据库、缓存以及消息代理。
   再简言之,Redis 是一个基于内存的 key-value 数据库。

2.2 原滋原味解释

原文地址:https://redis.io/topics/introduction

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

You can run atomic operations on these types, like appending to a string; incrementing the value in a hash; pushing an element to a list; computing set intersection, union and difference; or getting the member with highest ranking in a sorted set.

In order to achieve its outstanding performance, Redis works with an in-memory dataset. Depending on your use case, you can persist it either by dumping the dataset to disk every once in a while, or by appending each command to a log. Persistence can be optionally disabled, if you just need a feature-rich, networked, in-memory cache.

Redis also supports trivial-to-setup master-slave asynchronous replication, with very fast non-blocking first synchronization, auto-reconnection with partial resynchronization on net split.

Other features include:

Transactions
 - Pub/Sub
 - Lua scripting
 - Keys with a limited time-to-live
 - LRU eviction of keys
 - Automatic failover
You can use Redis from most programming languages out there.

Redis is written in ANSI C and works in most POSIX systems like Linux, *BSD, OS X without external dependencies. Linux and OS X are the two operating systems where Redis is developed and more tested, and we recommend using Linux for deploying. Redis may work in Solaris-derived systems like SmartOS, but the support is best effort. There is no official support for Windows builds, but Microsoft develops and maintains a Win-64 port of Redis.

三、Redis的一些特性

3.1 数据类型

   Redis支持多种数据结构,这也是它的亮点所在,除外Redis的单个Value最大限制为1GB,已经远远超过memcached的
1MB的大小限制。下面我们看看它有哪些数据类型,能干什么用,内部结构是怎么样的。

    • strings:字符串类型,最基本的数据类型,通常来存储基本的字段值;
    • hash:是一个string类型的Field和Value之间的映射表,通常用来存储一个对象中各个Key与Value信息的映射;
    • lists:元素都是string类型的双向链表,通常用来存储好友列表,粉丝列表,前十首热门歌曲,最新消息排行等;
    • set:是一个无序的string类型数据的集合,其内部用的是HashMap实现,只是Value都是空的而已,通常用来对数据
      做交集、并集、差集等操作,因此就有类似共同好友,共同兴趣等业务数据应运而生;
    • sortset:有序set,其内部仅仅只是在set基础上新增了一个排序score字段,通常用于具有排序功能的业务数据展示;

3.2 持久化

   Redis 提供了两种持久化方式,一个是RDB(Redis DataBase),另一个是AOF(Append Only File),至于说谁好谁差
呢?应该说各有所长,然而官网却建议我们两者结合使用,双保险嘛。   

    • RDB:就是在不同的时间点生成的快照文件并存储到硬盘上;
    • AOF:就是将redis的那些写指令记录下来,目的就是为了下次redis重启时可以快速执行这些指令恢复数据;
    
   不过既然用到Redis存储,个人建议如果大家没有什么特殊的持久化需求的话,完全不用理会这两种持久化的方式,直接
关闭即可,因为redis本来擅长的领域就是内存数据库,对于持久化存储方面不擅长。   

3.3 主从同步

   Redis 所谓的主从一方面可是一主有多从,但是另外一方面每个从节点也可以有多个从节点。而这样做的目的其实很简
单,一来是为了提升读的性能,二来也是为了去中心化增加数据冗余备份。一旦主节点挂了,从节点就得立马顶上去。
   
   然而主从之间的同步的思路也是挺简单的,都是slave主动向master发出sync指令,意思就是告诉master,slave需要同
步数据啦。master收到sync后则会调用bgsave指令fork一个子进程来持久化存储master的数据,在master的持久化的这个
短短期间内,master的write指令则存储到内存中。待master的子进程持久化完成后则将持久化的这个文件发送给slave节点,
待slave接收完成并将数据加载到slave内存中,然后master节点还会将持久化期间缓存的write指令再次发给slave节点。

3.4 发布订阅

   该发布订阅,和我们常用的MQ发送订阅的模式是一样的,支持订阅单个频道,也支持订阅多个频道,还支持类似正则表
达式一样的模式匹配。

3.5 事务

   Redis 也拥有自己的一套事务机制,只是这个所谓的事务机制没有关系型数据库那么强大,但是还是勉强够用,其实Redis
的事务,就是一组命令的集合,MULTI、EXEC、DISCARD 和 WATCH 是 Redis 事务相关的命令。既然是一组命令的执行,那么
Redis给了我们什么样的保证呢?来保证执行不被其他命令打断或篡改呢?

    • 保证一:事务是一个单独的隔离操作,所有命令被序列号有序执行;
    • 保证二:事务是一个原子操作,要么全部执行,要么全部不执行;

   然而在实际应用中总是那么差强人意,事务中如果是因为语法错误的话,则是不会提交事务,但是如果是运行时错误的
话,那就完蛋了,所有命令都会被执行,没有回滚机制,难道就没有解救措施了么,这个还真没有,运行时错误是编程时
需要杜绝的,这样的话其实也不存在需要什么回滚操作,一切顺其自然一气呵成。

   当然Redis还提供一个WATCH命令,来防止EXEC执行后发现值被篡改的话,则EXEC也照样返回失败处理;

3.6 Lua脚本

    Lua脚本功能是Reids 2.6版本的最大亮点,通过内嵌对Lua环境的支持,解决了长久以来不能高效地处理CAS命令的缺点, 
并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。

3.7 回收策略

    回收策略,还有一个变态的辅助帮手,就是客户端每执行一个命令,都会检测内存是否超标,如果超标,果断淘汰。
    
    六种回收策略如下:
    • noeviction 不回收;
    • allkeys-lru 从所有键中删除最近最少使用的键;
    • volatile-lru 从设置了过期时间的键中删除最近最少使用的键;
    • allkeys-random 从所有键中随机删除;
    • volatile-random 从设置了过期时间的键中随机删除;
    • volatile-ttl 从设置了过期时间的键中选择存活时间最短的键删除;

3.8 线程模型

    Redis 之所以有着飞一样的读写速度,这还得得益于它的单进程单线程模样的线程模型。经过Redis官网的测试性能结
果达到10W+的QPS。

    优秀的线程模型不但简化了代码逻辑,而且也不用考虑并发,也不用考虑各种锁的问题,更不存在多线程切换消耗CPU
的问题了,一切的一切,就是单线程挨个挨个执行。

    但是这种线程模型架构也带来一定的问题,牺牲了多核CPU性能,视多核CPU如无物,简直暴殄天物,反过来讲,目前
得到大家的方响,也没说redis十分慢,若如果真的遇到了redis十分慢的话,那很有可能是开发者的姿势不对,说不定又
在哪里进行了耗时的操作。

四、Redis优缺点

4.1 优点

    • 速度快,10W+的QPS,而且数据结构类似HashMap查询复杂度低;
    • 数据结构相对比较丰富,而且存储的Value也相对足够大;
    • 支持事务,而且还支持Lua脚本进行CAS操作;
    • 主从复制,支持读写分离,而且还支持RDB与AOF两种持久化方式;

4.2 缺点

    • 不能充分利用多核CPU的硬件优势;
    • 多主多从模式中,如果某一区域独立的主从同时挂掉且造成哈希槽的部分不可用,那么整个集群将会导致不可用;
    • 网络波动会造成主从之间会进行全量数据复制,如果快照文件过大,则会给内存带来非常大的压力;
    • 主从复制如果不在同一局域网,则会给主从复制的性能带来很大的损伤;

4.3 对比memcached

    • 数据类型:Redis不仅支持简单的k/v类型,还支持list,set.zset,hash等数据结构,但memcached支持图片视频缓存;
    • 存储方式:Redis在物理内存用完时还能将很少用的Value进行磁盘存储,有AOF与RDB两种持久化存储方式;
    • 主从模式:Redis支持一主多从,也可以支持多主多从,但memcached利用magent适用于一主多从;
    • 灾难恢复:Redis可以通过从AOF或RDB方式恢复数据,而memcached则不可恢复;
    • 数据大小:Redis的Value最大能支撑1G大小,而memcached最大支撑只有1M;
    • 内存分配:Redis会浪费一定时间去分配内存空间,而memcached则事先就分配好了一定的Page、Slab、Chunk空间;
    • 等等还有很多,就不一一列举了,想了解的更多跟详细,大家可以自行约会度娘问个究竟。

五、下载地址

https://gitee.com/ylimhhmily/HotFrameLearning.git

HotFrameLearning交流QQ群: 235322432

HotFrameLearning交流微信群: 微信沟通群二维码图片链接

欢迎关注,您的肯定是对我最大的支持!!!

-
<上一篇        首页        下一篇>


HMILYYLIMH
325 声望314 粉丝